package com.alvin.demo;

import com.alvin.demo.utils.ModbusRTURequestBuilder;
import com.alvin.demo.utils.NumberUtils;
import com.fazecast.jSerialComm.SerialPort;
import org.junit.Test;

/**
 * 静电压传感器
 */
public class TestJDY {

    @Test
    public void test01() throws InterruptedException {
        // 设置串口一些参数，除了串口号其他基本固定 COM2就是文章前配置的
        SerialPort serialPort = SerialPort.getCommPort("COM6"); // 串口设备名称
        serialPort.setBaudRate(115200); // 波特率
        serialPort.setNumDataBits(8); // 数据位
        serialPort.setParity(SerialPort.NO_PARITY); // 校验位
        serialPort.setNumStopBits(1); // 停止位

        if (serialPort.openPort()) {
            // 借助工具类，构建请求报文。表示：向从站地址1，发送功能3，寄存器起始地址0，读取寄存器数量10的请求（从起始地址开始，向后读取10个数据）
            byte[] requestMessage = ModbusRTURequestBuilder.buildModbusRTURequest(
                    1,
                    3,
                    4352,
                    2
            );
            // 读取数据
            serialPort.writeBytes(requestMessage, requestMessage.length);

            Thread.sleep(300); // 等待足够的时间以确保传感器响应

            // 响应数据的长度根据以下公式自行调整
            //  从站地址(1) + 功能码(1) + 数据总长度(1) + 数据 + CRC校验(2)
            // 数据总长度20的原因：读取10个寄存器的数据，会返回*2的字节数
            byte[] responseData = new byte[128];

            // 获取响应
            int bytesRead = serialPort.readBytes(responseData, responseData.length);
            System.out.println(bytesRead);
            // 通过打印可以看到，获取的数据为十进制
            System.out.println(NumberUtils.bytesToHexString(responseData , bytesRead));

            serialPort.closePort();
        } else {
            System.out.println("无法打开串口");
        }
    }

    public static void main(String[] args) {
        String hexString = "451750E9"; // PI的浮点表述
        float floatValue = hexToFloat(hexString);
        System.out.println("The float value is: " + floatValue);
    }

    // 16进制转化为浮点数
    public static float hexToFloat(String hex) {
        // 将十六进制字符串转换为整数
        long l = Long.parseLong(hex, 16);
        System.out.println(l);
        System.out.println((int) l);
        // 将整型转换为浮点数
        return Float.intBitsToFloat((int) l);
    }
}
